// 给定一个经过编码的字符串s，要求返回s经过解码之后的字符串
// 编码规则：k[encoded_string],encoded_string为字符串，k为整数，表示encoded_string重复k次

// 思路：堆栈，num用来存重复次数，res存待解码的字符串 或者 解码后待入栈的字符串，当遇到左中括号时，把上一轮得到res如栈，并把res置为空，把这一轮需要重复次数num入栈
// 等遇到右中括号的时候，把当前的待解码的字符串解码，并更新res
// 时间复杂度：O(n)，n是字符串的长度
// 空间复杂度：O(n)，stack的大小
function decodeString(str) {
    let stack1 = []
    let stack2 = []
    let num = 0
    let res = ''
    for (let i = 0; i < str.length; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            num = num * 10 + Number(str[i])
        } else if (str[i] === '[') {
            stack1.push(res)
            stack2.push(num)
            res = ''
            num = 0
        } else if (str[i] === ']') {
            let preRes = stack1.pop()
            let repeatNum = stack2.pop()
            res = preRes + res.repeat(repeatNum)
        } else {
            res += str[i]
        }
    }
    return res
}

let s = "3[a2[c]]"
console.log(decodeString(s))